<?php
/**
 * @brief	日历代码，生成日历
 * @note	摘抄和修改自网络
 */

class Calendar
{
    private $year;
    private $month;
    private $weeks  = array('日','一','二','三','四','五','六');
    
	// 构造函数，参数传递
    function __construct($options = array())
	{
        $this->year = date('Y');
        $this->month = date('m');
         
        $vars = get_class_vars(get_class($this));
        foreach ($options as $key=>$value)
		{
            if (array_key_exists($key, $vars))
			{
                $this->$key = $value;
            }
        }
    }
     
    function display()
    {
        echo '<table class="calendar">';
		
        $this->showChangeDate();
        $this->showWeeks();
        $this->showDays($this->year,$this->month);
		
        echo '</table>';
    }
     
    private function showWeeks()
    {
        echo '<tr>';
        foreach($this->weeks as $title)
        {
            echo '<th>' . $title . '</th>';
        }
        echo '</tr>';
    }
    
	// 显示日历，原理: 先计算当前日期，然后通过html的table生成. 通过date函数
	// 可以获取本月多少天，从周几开始第一天，然后就画出来了
    private function showDays($year, $month)
    {
        $firstDay = mktime(0, 0, 0, $month, 1, $year);
        $starDay = date('w', $firstDay);
        $days = date('t', $firstDay);
 
        echo '<tr name="date_tr">';
        for ($i=0; $i<$starDay; $i++)
		{
            echo '<td>&nbsp;</td>';
        }
        
		// todo: 还可以加一点：显示到下个月，如果点击，直接跳到下个月
        for ($j=1; $j<=$days; $j++)
		{
            $i++;
            if ($j == date('d'))
			{
                echo '<td class="today" id="date_' . $j . '">' . $j . '</td>';
            }
			else
			{
                echo '<td id="date_' . $j . '">'. $j . '</td>';
            }
            if ($i % 7 == 0)
			{
                echo '</tr><tr name="date_tr">';
            }
        }
         
        echo '</tr>';
    }
    
	// 显示日历上面的前一年后一年操作，用来修改日期
    private function showChangeDate()
    {
        $url = basename($_SERVER['PHP_SELF']);
		
		echo '<tr>';
        
		// 显示最上面一行的前一年前一月操作        
		echo '<td><a href="?' . $this->preYearUrl($this->year, $this->month). '">' . '<<' . '</a></td>';
		echo '<td><a href="?' . $this->preMonthUrl($this->year, $this->month) . '">' . '<' . '</a></td>';
		
        echo '<td colspan="3"><form>';
        
		// 显示当前年份，用下拉框显示，同时默认显示当年
        echo '<select name="year" onchange="window.location=\'' . $url . '?year=\'+this.options[selectedIndex].value+\'&month=' . $this->month.'\'">';
        for($ye=1970; $ye<=2100; $ye++)
		{
            $selected = ($ye == $this->year) ? 'selected' : '';
            echo '<option '. $selected. ' value="' . $ye. '">' . $ye . '</option>';
        }
        echo '</select>';
		
		// 显示当前月份，用下拉框显示，同时默认显示当年
        echo '<select name="month" onchange="window.location=\'' . $url . '?year=' . $this->year . '&month=\'+this.options[selectedIndex].value+\'\'">';
		for($mo=1; $mo<=12; $mo++)
		{
			$selected = ($mo == $this->month) ? 'selected' : '';
            echo '<option ' . $selected . ' value="' . $mo . '">' . $mo . '</option>';
        }
        echo '</select>';
		
        echo '</form></td>';
		
		// 显示最上面一行的后一年后一月操作
		echo '<td><a href="?' . $this->nextMonthUrl($this->year, $this->month) . '">' . '>' . '</a></td>';
		echo '<td><a href="?' . $this->nextYearUrl($this->year, $this->month) . '">' . '>>' . '</a></td>';
		
        echo '</tr>';
    }
    
	
    private function preYearUrl($year, $month)
    {
        $year = ($this->year <= 1970) ? 1970 : $year - 1 ;
         
        return 'year=' . $year.'&month=' . $month;
    }
    
    private function nextYearUrl($year,$month)
    {
        $year = ($year >= 2100) ? 2100 : $year + 1;
         
        return 'year=' . $year . '&month=' . $month;
    }
    
    private function preMonthUrl($year,$month)
    {
        if ($month == 1)
		{
            $month = 12;
            $year = ($year <= 1970) ? 1970 : $year - 1 ;
        }
		else
		{
            $month--;
        }        
         
        return 'year=' . $year . '&month=' . $month;
    }
    
    private function nextMonthUrl($year,$month)
    {
        if ($month == 12)
		{
            $month = 1;
            $year = ($year >= 2100) ? 2100 : $year + 1;
        }
		else
		{
            $month++;
        }
		
        return 'year=' . $year . '&month=' . $month;
    }     
}

?>